package cn.edu.cdp.service;

import cn.edu.cdp.domain.Account;
import cn.edu.cdp.domain.College;
import cn.edu.cdp.domain.Major;
import cn.edu.cdp.domain.Student;

import java.sql.Date;
import java.util.List;
import java.util.Map;

public interface AdminService {
    /*
    【学生】
    添加学生（同时添加学生账号）
    按照学号查找
    按照姓名模糊查找
    修改学生信息、密码
    删除学生（只是删除账号登录权）
    【课程】
    添加课程
    按照课程号查找
    按照课程名模糊查找
    修改课程信息
    如果study选课表没有记录，那么可以删除
     */
    // 表格数据
    List<Map<String, Object>> allAccount();
    List<College> allCollege();
    List<Map<String, Object>> allCourse();
    List<Map<String, Object>> allMajor();
    List<Student> allStudent();

    // 账号
    void accountInsert(Account account);
    void accountUpdate(Account account);
    void accountDeleteByUsername(String username);

    // 学院
    void collegeInsert(College college);
    void collegeUpdate(College college);
    void collegeDeleteById(String collegeId);

    // 专业
    void majorInsert(String majorId, String name, String category, String collegeName);
    void majorUpdate(String majorId, String name, String category, String collegeName);
    void majorDeleteById(String majorId);

    // 课程
    void courseInsert(String courseId, String name, Double credit, String semester, String collegeName);
    void courseUpdate(String courseId, String name, Double credit, String semester, String collegeName);
    void courseDeleteById(String courseId);

    // 学生
    void studentInsert(String studentId, String name, String sex, Date birthday, Double ceeScore, String nation, String nativePlace, String majorName);
    void studentUpdate(String studentId, String name, String sex, Date birthday, Double ceeScore, String nation, String nativePlace, String majorName);
    void studentDeleteById(String studentId);

    // 作业要求
    //（1）	查询XXX同学各科成绩：学号，姓名，专业名称，课程名称，成绩
    List<Map<String, Object>> scoreByStudentIdOrName(String text);
    //（2）	按专业统计学生人数：专业，学生人数
    List<Map<String, Object>> statisticStudentNumberByMajor();
    //（3）	查询某门课程成绩单：学号，姓名，专业名称，成绩
    List<Map<String, Object>> scoreByCourseIdOrName(String text);
    //（4）	查询学生总学分，不及格不计学分：学号，姓名，专业名称，总学分
    List<Map<String, Object>> totalCredit();
    //（5）	查询不及格学生信息：学号，姓名，专业名称，补考课程名称
    List<Map<String, Object>> failExam();
    //（6）	查询奖学金学生信息（要求：无不及格记录，且平均分在85分以上）：学号，姓名，专业名称，平均分
    List<Map<String, Object>> gainScholarship();

    // 查询时能不能先选学院，再选专业，然后可以输入姓名或学号进行查询，类似学于校网站的操作
    // 用于学生面板
    List<Student> filterStudent(String collegeName, String majorName, String studentIdOrName);
    List<Major> filterMajorByCollegeName(String collegeName);


    /*
# （1）	查询XXX同学各科成绩：学号，姓名，专业名称，课程名称，成绩
select s.student_id studentId, s.name studentName, m.name majorName, c.name courseName, y.score from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id;
select s.student_id studentId, s.name studentName, m.name majorName, c.name courseName, y.score from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id;
# （2）	按专业统计学生人数：专业，学生人数
select m.name majorName, count(*) number from student s left join major m on s.major_id=m.major_id group by m.major_id;
# （3）	查询某门课程成绩单：学号，姓名，专业名称，成绩
select s.student_id studentId, s.name studentName, m.name majorName, y.score from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id and (c.name like '线性%' or c.course_id='c002');
# （4）	查询学生总学分，不及格不计学分：学号，姓名，专业名称，总学分
select s.student_id studentId, s.name studentName, m.name majorName, sum(c.credit) from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id group by s.student_id;
select s.student_id studentId, s.name studentName, m.name majorName, sum(if(y.score >= 60, c.credit, 0)) sumCredit from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id group by s.student_id;
# （5）	查询不及格学生信息：学号，姓名，专业名称，补考课程名称
select s.student_id studentId, s.name studentName, m.name majorName, c.name courseName from student s, major m, course c, study y where s.major_id=m.major_id and y.student_id=s.student_id and y.course_id=c.course_id and y.score < 60;
# （6）	查询奖学金学生信息（要求：无不及格记录，且平均分在85分以上）：学号，姓名，专业名称，平均分
select s.student_id studentId, s.name studentName, m.name majorName, round(avg(y.score), 2) avgScore from student s, major m, study y where s.student_id=y.student_id and s.major_id=m.major_id group by s.student_id having min(y.score)>=60 and avg(y.score) >=85;
    */

}
